package com.hanzidong.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class StreamUtil {
	/**
	* 功能：批量关闭流。
	*
	* @param AutoCloseable... closeables 多个可关闭的对象
	 * @throws Exception 
	*/
	public static void closings(AutoCloseable... closeables) throws Exception {

		//如果不为空
		if(closeables != null) {
			//循环关闭
			for (int i = 0; i < closeables.length; i++) {
				closeables[i].close();
			}
		}
	}
	
	
	/**
	* 功能：流处理，默认不关闭流
	*
	* @param InputStream inputStream 输入流
	* @param OutputStream outputStream 输出流
	 * @throws Exception 
	*/
	public static void copy(InputStream inputStream, OutputStream outputStream) throws Exception {
		copy(inputStream, outputStream, false, false);
	}

	/**
	* 功能：流处理，用户可以选择是否关闭流
	*
	* @param InputStream inputStream 输入流
	* @param OutputStream outputStream 输出流
	* @param boolean closeInputStream  处理完后是否关闭输入流
	* @param boolean closeOutputStream  处理完后是否关闭输出流
	 * @throws Exception 
	*/
	public static void copy(InputStream inputStream, OutputStream outputStream, boolean closeInputStream, boolean closeOutputStream) throws Exception {
		
		//用于复制的字节数组
		byte[] b = new byte[1024];
		
		int len = 0;
		
		//复制，如果读取的个数大于0，证明读取到了数据
		while((len =  inputStream.read(b)) > 0) {
			//将数据写入输出流
			outputStream.write(b, 0, len);
		}
		
		//关闭流
		if(closeInputStream) {
			closings(inputStream);
		}
		if(closeOutputStream) {
			closings(outputStream);
		}
	}
	
	/**
	 * 功能：读取文本流，也可以将流转成字符串，默认编码为UTF-8
	 *
	 * @param InputStream inputStream 输入流
	 *
	 * @return 字符串
	 * @throws Exception 
	 */
	public static String asString(InputStream inputStream) throws Exception {
		return asString(inputStream, true);
	}
	/**
	* 功能：读取文本流，也可以将流转成字符串，默认编码为UTF-8
	*
	* @param InputStream inputStream 输入流
	* @param boolean isClose 读完后是否关闭流
	*
	* @return 字符串
	 * @throws Exception 
	*/
	public static String asString(InputStream inputStream, boolean isClose) throws Exception {
		return asString(inputStream,"UTF-8", true);
	}
	
	/**
	* 功能：读取文本流，也可以将流转成字符串
	*
	* @param InputStream inputStream 输入流
	* @param String encoding 指定编码
	* @param boolean isClose 读完后是否关闭流
	*
	* @return 字符串
	 * @throws Exception 
	*/
	public static String asString(InputStream inputStream, String encode, boolean isClose) throws Exception {
		//存放结果
		StringBuffer sb = new StringBuffer();
		
		//用于复制的字节数组
		byte[] b = new byte[1024];
		
		int len = 0;
		
		//复制，如果读取的个数大于0，证明读取到了数据
		while((len =  inputStream.read(b)) > 0) {
			//将数据写入StringBuffer
			sb.append(new String(b, 0, len, encode));
		}
		
		//关流
		if(isClose) {
			closings(inputStream);
		}
		return sb.toString();
	}
	
	/**
	 * 功能：读取文本文件，默认编码为UTF-8
	 *
	 * @param File textFile 文本文件
	 *
	 * @return 字符串
	 * @throws Exception 
	 */
	public static String asString(File textFile) throws Exception {
		return asString(new FileInputStream(textFile));
	}
	/**
	* 功能：读取文本文件，默认编码为UTF-8
	*
	* @param File textFile 文本文件
	* @param boolean isClose 读完后是否关闭流
	*
	* @return 字符串
	 * @throws Exception 
	*/
	public static String asString(File textFile, boolean isClose) throws Exception {
		return asString(new FileInputStream(textFile),isClose);
	}

	/**
	* 功能：读取文本文件，可以指定编码
	*
	* @param File textFile 文本文件
	* @param String encoding 指定编码
	* @param boolean isClose 读完后是否关闭流
	*
	* @return 字符串
	 * @throws Exception 
	*/
	public static String asString(File textFile, String encode, boolean isClose) throws Exception {
		return asString(new FileInputStream(textFile),encode,isClose);
	}

	
	/**
	* 功能：按行读取文本文件，返回一个List集合，默认编码为UTF-8，默认关闭流
	*
	* @param File textFile 文本文件
	* @param String encode 指定编码
	* @param boolean isClose 处理完成后是否关闭流
	*
	* @return 字符串集合
	 * @throws Exception 
	*/
	public static List<String> readingLineFormTextFile(File textFile) throws Exception{
		return readingLineFormTextFile(textFile, "UTF-8");
	}

	/**
	* 功能：按行读取文本文件，返回一个List集合，默认编码为UTF-8
	*
	* @param File textFile 文本文件
	* @param String encode 指定编码
	*
	* @return 字符串集合
	 * @throws Exception 
	*/
	public static List<String> readingLineFormTextFile(File textFile, String encode) throws Exception{
		
		//字符输入流
		FileReader fr = new FileReader(textFile);
		
		//缓冲字符输入流
		BufferedReader br = new BufferedReader(fr);
		
		//存放结果
		List<String> list = new ArrayList<String>();
		
		//用于存入复制的数据
		String str = null;
		
		//复制，如果读取的不为空，证明读取到了数据
		while((str = br.readLine()) != null) {
			list.add(str);
		}
		
		//关流
		closings(br);
		closings(fr);

		return list;
	}
	
	
}
